package com.wef.system.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.hibernate.Hibernate;

import com.gfa4j.exception.ValidateRuntimeException;
import com.gfa4j.hibernate.BaseObject;
import com.gfa4j.service.impl.BaseServiceImpl;
import com.wef.system.entity.Module;
import com.wef.system.entity.domain.ModuleDomain;
import com.wef.system.service.MenuGroupService;
import com.wef.system.service.ModuleService;
import com.wef.system.service.ModuleTitleService;

public class ModuleServiceImpl extends BaseServiceImpl implements ModuleService {

	private ModuleTitleService moduleTitleService;

	public void setModuleTitleService(ModuleTitleService moduleTitleService) {
		this.moduleTitleService = moduleTitleService;
	}

	private MenuGroupService menuGroupService;

	public void setMenuGroupService(MenuGroupService menuGroupService) {
		this.menuGroupService = menuGroupService;
	}

	public Module addModule(Module module) {
		validateModule(module);
		Module newModule = (Module) super.saveObject(module);
		if (Hibernate.isPropertyInitialized(module, ModuleDomain.moduleTitles) && module.getModuleTitles().size() > 0) {
			moduleTitleService.addModuleTitles(module.getModuleTitles(), newModule.getModuleId());
		}
		// if (Hibernate.isPropertyInitialized(module,ModuleDomain.menuGroups) && module.getMenuGroups().size() > 0 ){
		// menuGroupService.saveOrUpdateMenuGroups(module.getMenuGroups());
		// }
		return newModule;
	}

	public Module updateModule(Module module) {
		if (Hibernate.isPropertyInitialized(module, ModuleDomain.moduleTitles) && module.getModuleTitles().size() > 0) {
			moduleTitleService.addModuleTitles(module.getModuleTitles(), module.getModuleId());
		}
		// if (Hibernate.isPropertyInitialized(module,ModuleDomain.menuGroups) && module.getMenuGroups().size() > 0 ){
		// menuGroupService.saveOrUpdateMenuGroups(module.getMenuGroups());
		// }
		return (Module) super.updateObject(module);
	}

	public void removeModule(Module module) {

		List<String> initPropertys = new ArrayList<String>();
		initPropertys.add(ModuleDomain.moduleTitles);
		initPropertys.add(ModuleDomain.menuGroups);
		module = (Module) load(Module.class, module.getModuleId(), initPropertys);

		if (Hibernate.isPropertyInitialized(module, ModuleDomain.moduleTitles) && module.getModuleTitles().size() > 0) {
			moduleTitleService.removeModuleTitles(module.getModuleTitles());
		}
		
		this.validateDelete(module);
		super.deleteObject(module);
	}

	public Module saveOrUpdateModule(Module module) {
		if (module.getRowStatus() == BaseObject.ROWSTATUS_ADDED) {
			return this.addModule(module);
		}
		if (module.getRowStatus() == BaseObject.ROWSTATUS_MODIFIED) {
			return this.updateModule(module);
		}
		if (module.getRowStatus() == BaseObject.ROWSTATUS_DELETED) {
			this.removeModule(module);
			return Module.NULL;
		}
		return module;
	}

	public void saveOrUpdateModules(List<Module> modules) {
		StringBuilder errorString = new StringBuilder();
		for (Module module : modules) {
			try {
				saveOrUpdateModule(module);
			} catch (ValidateRuntimeException ex) {
				errorString.append(ex.getMessage() + "\n");
			}
		}
		if (errorString.length() > 0) {
			throw new ValidateRuntimeException(errorString.toString());
		}
	}

	public void saveOrUpdateModules(Set<Module> modules) {
		StringBuilder errorString = new StringBuilder();
		for (Module module : modules) {
			try {
				saveOrUpdateModule(module);
			} catch (ValidateRuntimeException ex) {
				errorString.append(ex.getMessage() + "\n");
			}
		}
		if (errorString.length() > 0) {
			throw new ValidateRuntimeException(errorString.toString());
		}
	}

	public void validateModule(Module module) {

	}

	public List<Module> getAllModules(){
		List<Module> moduleList = this.loadAll(Module.class);
		for (Module module : moduleList) {
			Hibernate.initialize(module.getModuleTitles());
		}
		return moduleList;
	}
}
